
(* 
**********************************************************

		 COSY_PAK package chap3.m		

**********************************************************
*)


If [ TrueQ[ $VersionNumber >= 2.0 ],
     Off[ General::spell ];
     Off[ General::spell1 ] ]
     
(*  B E G I N     P A C K A G E  *)


BeginPackage["COSYPAK`chap3`",,"SignalProcessing`Support`SigProc`", 
		"SignalProcessing`Analog`LaPlace`",
		"SignalProcessing`Analog`InvLaPlace`"]	     

Response::usage = "Response[ transf, Input, s, {TimeVar, StartTime, EndTime}, gopts]: Plots the output of transfer function `transf' with Laplace input signal `Input'.  The Laplace variable is `s'.  The output graph uses the variable `TimeVar' and starts at `StartTime' and ends at `EndTime'.  Returns the output variable as a function of time `t'.";

SecOrder::usage = "SecOrder[zeta, wn, t]: Gives the unit step response value at time instant t for a standard second order system wn2/(s2 + 2z wn s + wn2) with the damping ratio z=zeta and natural frequency wn =wn. Returns instantaneous value of the step response output variable at time instant `t'.";

Begin["`Private`"]

SecOrder/:SecOrder[damp_,wn_,t_]:=
	Module[{wd},wd = wn Sqrt[1-damp^2]; 
	 	1-E^(-damp wn t) (Cos[wd t]+damp/Sqrt[1-damp^2] Sin[wd t])]/;
	 	0 <= damp < 1
	
SecOrder/:SecOrder[damp_,wn_,t_]:= 1 - E^(-wn t)( 1 + wn t)/;
			Abs[damp - 1] < 0.0001
			
SecOrder/:SecOrder[damp_,wn_,t_]:=
	Module[{s1,s2,temp}, temp = Sqrt[damp^2 -1];
	 	s1 = (damp + temp) wn ;
	 	s2 = (damp - temp) wn ;
	 	y = 1 + wn/2/temp ( (E^(-s1 t))/s1 - (E^(-s2 t))/s2)
	 	]/;damp > 1

(*

*)	
Response[transf_,input_,s_,{t_,tmin_,tmax_},opts___] :=
Module[{outputlp ,output,inputfunc},
	outputlp = transf input;
	output = InvLaPlace[outputlp,s,t,Dialogue->False,Apart->All];
	output = Simplify[ComplexExpand[output]];
	inputfunc = InvLaPlace[input,s,t,Dialogue->False,Apart->All];
	inputfunc = Simplify[ComplexExpand[inputfunc]];
	
	(* Apply SignalPlot to plot output in solid line and
	    inputfunc in dash line *)	
	SignalPlot[output + inputfunc I,{t,tmin,tmax},
		FrameLabel->{"Time","Y(t)","Time Response of G(s) "," "},
		Frame->True,PlotRange -> All,GridLines->Automatic, 
        FrameTicks -> {Automatic, Automatic,Automatic, Automatic},
		opts];
	Return[output]					
		
		]/; tmin < tmax


End[];
EndPackage[];

(*  E N D     P A C K A G E  *)

If [ TrueQ[ $VersionNumber >= 2.0 ],
     On[ General::spell ];
     On[ General::spell1 ] ]

